import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

# 创建crawlspider爬虫 scrapy genspider -t crawl 文件名 域名
"""
需求: 抓取这个网站上所有的新闻数据,在详情页中抓取数据,在列表页不抓取数据

在列表页中获取详情页的url地址  提取数据 指定callback  follow=False
获取翻页的url地址  不需要提取数据  不指定callback  follow=True
"""


class NewscrawlSpider(CrawlSpider):
    name = 'newscrawl'
    allowed_domains = ['xiancn.com']
    start_urls = ['http://xiancn.com/']

    """
    rules是一个元组或者是列表，包含的是Rule对象
    Rule表示规则，其中包含LinkExtractor,callback和follow等参数
        LinkExtractor:连接提取器，可以通过正则或者是xpath来进行url地址的匹配
        callback :表示经过连接提取器提取出来的url地址响应的回调函数，可以没有，没有表示响应不会进行回调函数的处理
        follow：连接提取器提取的url地址对应的响应是否还会继续被rules中的规则进行提取，True表示会，Flase表示不会
    """
    rules = (
        # 获取详情页的url地址
        # allow对应的正则表达式匹配的是href属性的值
        Rule(LinkExtractor(allow=r'content_\d+.htm'), callback="parse_item"),
        # 获取翻页的url地址
        Rule(LinkExtractor(allow=r'node_14476_\d+.htm'), follow=True),
    )

    def parse_item(self, response):
        """
        :param response: 详情页的响应对象
        :return:
        """
        item = {}
        # item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        # item['name'] = response.xpath('//div[@id="name"]').get()
        # item['description'] = response.xpath('//div[@id="description"]').get()
        item['title'] = response.xpath('//div[@class="biaoti"]/text()').extract_first()
        print(item)
        return item
